package cn.zhuzicc.basic.jvm.t1;

import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * @author zhaoxiang
 * @version 1.0
 * @description 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
 * 配置元空间大小： -XX:MaxMetaspaceSize=8m
 * @Date 2021/9/19 16:26
 */
public class Demo1_8 extends ClassLoader { // 可以用来加载类的二进制字节码
    public static void main(String[] args) {
        int j = 0;
        try {
            Demo1_8 demo1_8 = new Demo1_8();
            for (int i = 0; i < 10000;i++, j++) {
                // ClassWriter 作用是生成类的二进制字节码
                ClassWriter classWriter = new ClassWriter(0);
                /*
                参数说明：
                    版本号，类的访问修饰符，类名，包名，父类，接口
                 */
                classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);
                byte[] bytes = classWriter.toByteArray();
                // 执行类加载器
                demo1_8.defineClass("Class" + i, bytes, 0, bytes.length);// Class对象

            }
        } catch (Throwable t) {
            t.printStackTrace();
            System.out.println(j);
        }
    }

}
